var express = require('express'),
  mongoose = require('mongoose'),
  Post = mongoose.model('Post'),
  User = mongoose.model('User'),
  Category = mongoose.model('Category'),
  async = require('async');
/*
*	page : 当前页
*	pageSize: 一页展示多少条
*	Model: 当前查询的Model
*	populate: 当前model需要调用的其他model名称
*	queryParams: 查询条件
* 	sortParams: 排序条件
*	callback: 回调函数
*/
var pageQuery = function (page, pageSize, Model, populate, queryParams, sortParams, callback) {
	// 跳过多少条数据开始查询
	var start = (page - 1) * pageSize;
	// 当前的页码
	var $page = {
		pageNumber : page
	};
	/*
	web: https://cnodejs.org/topic/54acfbb5ce87bace2444cbfb
	parallel(tasks, [callback])
	parallel函数是并行执行多个函数，每个函数都是立即执行，不需要等待其它函数先执行。
	传给最终callback的数组中的数据按照tasks中声明的顺序，而不是执行完成的顺序。
	tasks参数可以是一个数组或是json对象，和series函数一样，
	tasks参数类型不同，返回的results格式会不一样。
	*/
	async.parallel({
		// 查询总共多少条数据
		count: function (done) {
			Model.find(queryParams).count().exec(function (err, count) {
				done(err, count);
			});
		},
		// 查询一页的记录
		records: function (done) {
			Model.find(queryParams).skip(start).limit(pageSize).populate(populate).sort(sortParams).exec(function (err, doc) {
				done(err, doc);
			});
		}
	}, function(err, results) {
		var count = results.count;
		console.log(count);
		// 共多少页
		$page.pageCount = parseInt((count - 1) / pageSize + 1);
		// 当前页有多少条记录
		$page.results = results.records;
		// 抛出对象
		callback(err, $page);
	});
};

module.exports = {
    pageQuery: pageQuery
};